package models;

import java.util.Calendar;
import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import net.sf.oval.constraint.ValidateWithMethod;
import play.data.validation.InFuture;
import play.data.validation.Required;
import play.db.jpa.Model;
import controllers.CustomCRUD;

@Entity
public class AutomaticObjective extends Model {
	
	private static final long serialVersionUID = -5466842427498801310L;

	@ManyToOne
	private Paciente paciente;
	
	@Required(message="objetivosAutomatico.requerido")
	private String nombreAutomaticObjective;
	
	@Temporal(TemporalType.DATE)
	@Required
	private Date fechaInicio;
	
	@InFuture
	@Temporal(TemporalType.DATE)
	@Required(message="objetivosAutomatico.requerido")
	@ValidateWithMethod(methodName="validarCronologiaFechas", parameterType=Date.class, message="objetivosAutomatico.fechaMayorActual")
	private Date fechaLimiteAutomaticObjective;
    
    private Boolean cumplidoAutomaticObjective;
    
    public AutomaticObjective() {
    	super();
    	this.setFechaInicio(Calendar.getInstance().getTime());
    }
    
	public boolean validarCronologiaFechas(Date fechaLimite) {
		Date fechaActual = new Date();
		return fechaActual.before(fechaLimite);
	}
    
	/* Redefinición de _save() para que antes de guardarlo le setee una objeto del modelo de dominio
	 * que no puede realizarse antes.
	 * Debido al initial-data se agrega un try para catchear la NullPointerExc que tira SecureSocial.getCurrentUser(),
	 * ya que al levantar la app no hay user logueado, por lo tanto deja que la propiedad en cuestión se configure desde el initial-data.yml
	 * @see play.db.jpa.JPABase#_save()
	 */
	public void _save(){
		Paciente paciente = null;
		try{
			paciente = (Paciente)CustomCRUD.getUsuarioLogueado();
			this.setPaciente(paciente);
			super._save();
		}catch(NullPointerException npe){
			super._save();
		}
	}
    
	public Paciente getPaciente() {
		return paciente;
	}
	
	public void setPaciente(Paciente paciente) {
		this.paciente = paciente;
	}
	
	public String getNombreAutomaticObjective() {
		return nombreAutomaticObjective;
	}
	
	public void setNombreAutomaticObjective(String nombre) {
		this.nombreAutomaticObjective = nombre;
	}
	
	public Date getFechaLimiteAutomaticObjective() {
		return fechaLimiteAutomaticObjective;
	}
	
	public void setFechaLimiteAutomaticObjective(Date fechaLimite) {
		this.fechaLimiteAutomaticObjective = fechaLimite;
	}
	
	public Boolean getCumplidoAutomaticObjective() {
		return cumplidoAutomaticObjective;
	}
	
	public void setCumplidoAutomaticObjective(Boolean cumplido) {
		this.cumplidoAutomaticObjective = cumplido;
	}

	public Date getFechaInicio() {
		return fechaInicio;
	}

	public void setFechaInicio(Date fechaInicio) {
		this.fechaInicio = fechaInicio;
	}
}
